// redis数据管理:
//     1.会话信息管理:会话ID和用户ID的键值对
//     用户登录的时候创建登录会话:分配一个登录会话ID,向redis中添加键值对
//     用户进行其他操作时:发送会话ID过来;通过会话ID在redis键值对中查找
//     操作:会话信息的新增/删除/获取
//     2.登陆状态的管理:用户ID和空值的键值对
//     用户登陆的时候,添加用户ID进去
//     用户长连接断开时,删除这个用户ID的键值对
//     重复登陆时,查询对应的用户ID信息是否存在,如果存在就是重复登陆
//     操作:登陆状态的新增/删除/判断是否存在
//     3.验证码的管理:验证码ID和验证码键值对
//     用户获取短信验证码时,生成验证码和ID,添加redis管理(验证码信息具有时效性)
//     手机号注册/登陆/修改绑定手机号时:进行验证码及ID的验证
//     当验证验证码时:删除验证码
//     操作:验证码信息的新增/删除/获取
#pragma once
#include<sw/redis++/redis.h>
#include<iostream>
#include"logger.hpp"

namespace wzl
{
    class RedisClientFactory
    {
    public:
        static std::shared_ptr<sw::redis::Redis> create(const std::string& host,int32_t port,\
            int32_t db,bool keepalive)
        {
            sw::redis::ConnectionOptions opts;
            opts.host = host;
            opts.port = port;
            opts.db = db;
            opts.keep_alive = keepalive;
            std::shared_ptr<sw::redis::Redis> res = std::make_shared<sw::redis::Redis>(opts);
            return res;
        }
    private:
    };

    class Session
    {
    public:
        using ptr = std::shared_ptr<Session>;
        Session(const std::shared_ptr<sw::redis::Redis>& redis_client)
            :_redis_client(redis_client)
        {}
        void append(const std::string& ssid,const std::string& uid)
        {
            _redis_client->set(ssid,uid);
        }
        void remove(const std::string& ssid)
        {
            _redis_client->del(ssid);
        }
        sw::redis::OptionalString uid(const std::string& ssid)
        {
            return _redis_client->get(ssid);
        }
    private:
        std::shared_ptr<sw::redis::Redis> _redis_client;
    };

    class Status
    {
    public:
        using ptr = std::shared_ptr<Status>;
        Status(const std::shared_ptr<sw::redis::Redis>& redis_client)
            :_redis_client(redis_client)
        {}
        void append(const std::string& uid)
        {
            _redis_client->set(uid,"");
        }
        void remove(const std::string& uid)
        {
            _redis_client->del(uid);
        }
        bool exists(const std::string& uid)
        {
            auto res = _redis_client->get(uid);
            if(res) {return true;}
            return false;
        }
    private:
        std::shared_ptr<sw::redis::Redis> _redis_client;
    };

    class Codes
    {
    public:
        using ptr = std::shared_ptr<Codes>;
        Codes(const std::shared_ptr<sw::redis::Redis>& redis_client)
            :_redis_client(redis_client)
        {}
        void append(const std::string& cid,const std::string& code,\
            const std::chrono::milliseconds& t = std::chrono::milliseconds(60000))
        {
            auto res = _redis_client->set(cid,code,t);
        }
        void remove(const std::string& cid)
        {
            _redis_client->del(cid);
        }
        sw::redis::OptionalString code(const std::string& cid)
        {
            std::cout<<*_redis_client->get(cid)<<std::endl;
            return  _redis_client->get(cid);
        }
    private:
        std::shared_ptr<sw::redis::Redis> _redis_client;
    };
}
